﻿using DreamCMS.BLL;
using DreamCMS.Entity;
using DreamCMS.Entity.Common;
using DreamCMS.WebCore.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;

namespace DreamCMS.Web
{
    public class FrontPageBase : Page
    {
        #region 本类内部数据成员
        protected DateTime startTime = DateTime.Now;
        /// <summary>
        /// 模板路径
        /// </summary>
        private string templatePath = null;
        /// <summary>
        /// NVelocity模板辅助对象
        /// </summary>
        protected TemplateHelper tplHelper = null;
        /// <summary>
        /// 主题名称（对应themes文件夹里的某个主题目录）。用来初始化模板路径给NVelocity使用。
        /// </summary>
        private string themeName = null;

        #endregion

        public FrontPageBase()
        {
            UpdateViewCount();//1. 接受到用户访问请求，首先更新数据统计信息到数据库！
            JudgeSiteStatus(); //2. 根据管理员后台设置信息来判断站点是否关闭，关闭则禁止访问。
            InitThemeName();   //3. 初始化网站主题名称（根据是否是手机来设置对应的主题名）
            InitTemplatePath();//4. 初始化模板目录这个成员变量
            InitTemplateHelper();//5. 初始化模板引擎辅助类，并初始化其中的前台全局标签上下文对象
        }

        #region 内部方法，供Page_Load内部函数调用
        /// <summary>
        /// 更新访问统计
        /// </summary>
        private void UpdateViewCount()
        {
            string cookie = "isview";
            int isview = StringHelper.StrToInt32(RequestHelper.GetCookieStr(cookie), 0);
            //未访问或按刷新统计
            if (isview == 0 || SiteSettingManager.GetSiteSettingInfo().GuestRecordType == SiteRecordType.ByReFresh)
            {
                StatisticInfo stat = StatisticManager.GetStatisticInfo();
                stat.VisitCounts += 1;
                StatisticManager.UpdateStatisticInfo();
            }
            //未访问（此处有BUG，若用户通过修改工具cookie将该字段设置为0，则可以达到24小时内多次刷访问量的目的）
            if (isview == 0 && SiteSettingManager.GetSiteSettingInfo().GuestRecordType == SiteRecordType.By24Ours)
            {
                ServerHelper.SetCookie(cookie, "1", 1440);

            }
        }
        #endregion

        #region 判断站点开关状态
        /// <summary>
        /// 判断站点开关状态
        /// </summary>
        private void JudgeSiteStatus()
        {
            SiteSettingInfo setting = SiteSettingManager.GetSiteSettingInfo();
            if (setting.TheSiteStatus == (int)SiteStatus.Closed)
            {
                HttpContext.Current.Response.Clear();
                HttpContext.Current.Response.StatusCode = 500;
                HttpContext.Current.Response.Write("站点已关闭，请联系管理员cuiyongjian@qq.com");
                HttpContext.Current.Response.End();
            }
            return;
        }
        #endregion

        #region 初始化主题名称
        /// <summary>
        /// 初始化主题名称
        /// </summary>
        private void InitThemeName()
        {
            this.themeName = SiteSettingManager.GetSiteSettingInfo().Theme;
            if (RequestHelper.IsMobile)
            {
                this.themeName = SiteSettingManager.GetSiteSettingInfo().MobileTheme;
            }
        }
        #endregion

        #region 初始化当前使用的模板路径，以供NVelocity模板引擎使用
        /// <summary>
        /// 初始化当前使用的模板路径，以供NVelocity模板引擎使用
        /// </summary>
        private void InitTemplatePath()
        {
            this.templatePath = HttpContext.Current.Server.MapPath(string.Format("{0}/themes/{1}/template/", ConfigHelper.SiteRootPath, this.themeName));
        }
        #endregion



        #region 初始化模板引擎辅助类
        /// <summary>
        /// 初始化模板引擎辅助类
        /// 使用相关标签数据初始化模板辅助类中的NVelocity模板上下文对象(可以发现都是前端模板需要的内容)
        /// </summary>
        private void InitTemplateHelper()
        {
            this.tplHelper = new TemplateHelper(this.templatePath);


            ///////////////////////////////////////////////////////////////////////
            #region 全局标签
            //下面初始化模板对象的一些全局标签
            tplHelper.Put(DmTagsSet.SITE_NAME, SiteSettingManager.GetSiteSettingInfo().SiteName);
            tplHelper.Put(DmTagsSet.SITE_PATH, ConfigHelper.SiteRootPath);
            tplHelper.Put(DmTagsSet.SITE_URL, RequestHelper.SiteUrl);

            tplHelper.Put(DmTagsSet.SITE_DESCRIPTION, SiteSettingManager.GetSiteSettingInfo().SiteDescription);
            tplHelper.Put(DmTagsSet.META_KEYWORDS, SiteSettingManager.GetSiteSettingInfo().MetaKeywords);
            tplHelper.Put(DmTagsSet.META_DESCRIPTION, SiteSettingManager.GetSiteSettingInfo().MetaDescription);

            tplHelper.Put(DmTagsSet.PAGE_TITLE, "首页"); //先初始化，之后每个页面根据标题不同再进行修改这个标签。
            tplHelper.Put(DmTagsSet.FOOTER_HTML, SiteSettingManager.GetSiteSettingInfo().FooterHtml);

            tplHelper.Put(DmTagsSet.VERSION, SiteSettingManager.GetSiteSettingInfo().Version);

            tplHelper.Put(DmTagsSet.THEME_PATH, ConfigHelper.SiteRootPath + "themes/" + themeName + "/");
            tplHelper.Put(DmTagsSet.THEME_URL, RequestHelper.SiteUrl + "themes/" + themeName + "/");

            tplHelper.Put(DmTagsSet.IS_DEFAULT, "0"); //先初始化为0
            tplHelper.Put(DmTagsSet.IS_POST, "0"); //先初始化为0


            tplHelper.Put(DmTagsSet.FEED_URL, RequestHelper.SiteUrl + "rss.aspx?type=post"); //订阅文章
            tplHelper.Put(DmTagsSet.FEED_COMMENT_URL, RequestHelper.SiteUrl + "rss.aspx?type=comment"); //订阅评论

            tplHelper.Put(DmTagsSet.PAGER, string.Empty);
            tplHelper.Put(DmTagsSet.PAGER_INDEX, RequestHelper.QueryInt("page", 1)); //先初始化为1，之后根据特定页面需要再修改

            tplHelper.Put(DmTagsSet.URL, RequestHelper.CurrentUrl);  //用户访问的当前真实全URL（用于评论表单的提交地址）
            tplHelper.Put(DmTagsSet.DATE, DateTime.Now); //当前日期和时间
            //TODO:此处有归档标签，需要后续实现. 而且本版本放弃了QueryCount标签

            tplHelper.Put(DmTagsSet.SEARCH_KEYWORD, string.Empty); //搜索后渲染结果页面会给他赋值渲染出来

            tplHelper.Put(DmTagsSet.PROCESS_TIME, 0); //页面处理时间，之后根据每个页面处理的最后计算重新赋值。

            tplHelper.Put(DmTagsSet.ENABLE_VERIFYCODE, SiteSettingManager.GetSiteSettingInfo().EnableVerifyCode); //是否开启验证码，前台用来显示相应的信息给用户选择。

            string headhtml = string.Empty; //头部版权元信息标签

            headhtml += string.Format("<meta name=\"generator\" content=\"DreamCMS {0}\" />\n", SiteSettingManager.GetSiteSettingInfo().Version);
            headhtml += "<meta name=\"author\" content=\"DreamCMS Team\" />\n";
            headhtml += string.Format("<meta name=\"copyright\" content=\"2014-{0} DreamCMS Team.\" />\n", DateTime.Now.Year);
            headhtml += string.Format("<link rel=\"alternate\" type=\"application/rss+xml\" title=\"{0}\"  href=\"{1}\"  />\n", SiteSettingManager.GetSiteSettingInfo().SiteName, RequestHelper.SiteUrl + "rss.aspx");
            headhtml += string.Format("<link rel=\"EditURI\" type=\"application/rsd+xml\" title=\"RSD\" href=\"{0}rsd.aspx\" />\n", RequestHelper.SiteUrl);
            headhtml += string.Format("<link rel=\"wlwmanifest\" type=\"application/wlwmanifest+xml\" href=\"{0}wlwmanifest.aspx\" />", RequestHelper.SiteUrl);

            tplHelper.Put(DmTagsSet.HEAD, headhtml);
            #endregion
            ////////////////////////////////////////////////////////////////////


            //////////////////////////////////////////////////////////////////
            //与文章相关的，但全局使用的标签。初始化。
            #region 与文章相关的，但全局使用的标签。初始化。
            tplHelper.Put(DmTagsSet.RECENT_POSTS, PostManager.GetPostList(SiteSettingManager.GetSiteSettingInfo().SidebarPostCount, -1, -1,PostRecommend.Other, PostStatus.Published, PostTopStatus.Other, PostHideStatus.NoHide));
            tplHelper.Put(DmTagsSet.RECOMMEND_POSTS, PostManager.GetPostList(SiteSettingManager.GetSiteSettingInfo().SidebarPostCount, -1, -1, PostRecommend.Rec, PostStatus.Published, PostTopStatus.Other, PostHideStatus.NoHide));
            tplHelper.Put(DmTagsSet.TOP_POSTS, PostManager.GetPostList(SiteSettingManager.GetSiteSettingInfo().SidebarPostCount, -1, -1, PostRecommend.Other, PostStatus.Published, PostTopStatus.Top, PostHideStatus.NoHide));
            #endregion
            ///////////////////////////////////////////////////


            ///////////////////////////////////////////////////////////
            #region 与（作者,分类,标签）相关的全局使用的标签

            tplHelper.Put(DmTagsSet.AUTHORS, UserManager.GetUsers().FindAll(delegate(UserInfo user) { return user.Status == UserStatus.Normal; }));  //博客系统常用到作者列表，分类右侧边栏进行列表
            tplHelper.Put(DmTagsSet.CATEGORIES, CategoryManager.GetCategoryList());
            tplHelper.Put(DmTagsSet.RECENT_TAGS, TagManager.GetTagList(SiteSettingManager.GetSiteSettingInfo().SidebarPostCount)); //博客系统的右侧边栏常用
            #endregion
            ////////////////////////////////////////////////////////////////////

            //TODO:与评论相关的前台全局使用的标签

            //////////////////////////////////////////////////////////////////////////////////////////
            //与统计相关的全局使用的标签（文章数，评论数，访问量等，肯定是全局使用）
            tplHelper.Put(DmTagsSet.POST_COUNT, StatisticManager.GetStatisticInfo().PostCounts);
            tplHelper.Put(DmTagsSet.COMMENT_COUNT, StatisticManager.GetStatisticInfo().CommentCounts);
            tplHelper.Put(DmTagsSet.VIEW_COUNT, StatisticManager.GetStatisticInfo().VisitCounts);
            tplHelper.Put(DmTagsSet.AUTHOR_COUNT, UserManager.GetUsers().FindAll(delegate(UserInfo user) { return user.Status == UserStatus.Normal; }).Count);
            /////////////////////////////////////////////////////////////////////////////////////

            //////////////////////////////////////////////////////////////////////////////////////
            //#region 链接（）友情链接和导航链接
            //TODO:连接，后续实现
            //tplHelper.Put(DmTagsSet.LINKS, StatisticManager.GetLinkList(-1, 1));
            //tplHelper.Put(DmTagsSet.NAV_LINKS, StatisticManager.GetLinkList((int)LinkPosition.Navigation, 1));
            //tplHelper.Put(DmTagsSet.GENERAL_LINKS, StatisticManager.GetLinkList((int)LinkPosition.General, 1));

            //#endregion
            /////////////////////////////////////////////////////////////////////////////////////
        }
        #endregion

        #region 渲染模板，输出页面
        /// <summary>
        /// 渲染模板，输出页面
        /// </summary>
        /// <param name="req"></param>
        /// <param name="templateName"></param>
        protected void Display(string templateName)
        {
            tplHelper.Put(DmTagsSet.PROCESS_TIME, DateTime.Now.Subtract(startTime).TotalSeconds); //写出之前的页面处理所用时间。
            HttpContext.Current.Response.Write(tplHelper.BuildString(templateName)); //渲染生成模板文本并写入到HTTP输出缓冲区等服务器发送给客户
        }
        #endregion

    }
}